package com.atguigu.mybatis.mapper;

import com.atguigu.mybatis.pojo.User;
import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

public interface SelectMapper {

    /**
     * 若sql语句查询的结果为多条时,一定不能以实体类类型作为方法的返回值
     * 否则会抛出异常: TooManyResultException
     * 若sql语句查询的结果为一条时,此时可以使用实体类类型或list集合类型作为方法的返回值
     */

    /**
     * 根据id查询用户信息
     * @param id
     * @return
     */
    User getUserById(@Param("id") Integer id);

    /**
     * 查询所有的用户信息
     * @return
     */
    List<User> getAllUser();

    /**
     * 查询用户的总数量
     * @return
     */
    Integer getCount();

    /**
     * 根据id查询用户信息为一个map集合
     * @param id
     * @return
     */
    Map<String, Object> getUserByIdToMap(@Param("id") Integer id);

    /**
     * 查询所有用户信息为一个map集合
     * 若查询的数据有多条时,并且要将每条数据转换成map集合
     * 此时有两种解决方案:
     *     1.将mapper接口方法的返回值设置为泛型是map的list集合(用的多！！！！重要重要重要！！！！)
     *          List<Map<String,Object>> getAllUserToMap();
     *          返回的结果: {password=123, gender=男, id=6, age=28, email=7845@qq.com, username=ayn},
     *                    {password=456, gender=男, id=4, age=18, email=123@qq.com, username=admin},
     *     2.可以将每条数据转换的map的集合放在一个大的map中,但是必须要通过@MapKey注解将查询的某个字段的值作为大的map的键
     *          @MapKey("id")
     *          Map<String, Object> getAllUserToMap();
     *          返回的结果: {2={password=123, gender=男, id=2, age=18, email=123@qq.com, username=root},
     *                     4={password=123, gender=男, id=4, age=18, email=123@qq.com, username=admin},
     *                     5={password=123, gender=男, id=5, age=18, email=123@qq.com, username=admin},
     *                     6={password=123, gender=男, id=6, age=28, email=7845@qq.com, username=ayn}}
     * @return
     */
     //方式一：将mapper接口方法的返回值设置为泛型是map的list集合(用的多！！！！重要重要重要！！！！)
     //List<Map<String,Object>> getAllUserToMap();
     //方式二：
    @MapKey("id")
    Map<String,Object> getAllUserToMap();



}
